package com.acaslless.datasource.handler;

import cn.hutool.core.util.ObjectUtil;
import com.acaslless.core.utils.ServletUtil;
import com.acaslless.datasource.domain.BaseEntity;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;

import java.time.LocalDateTime;

public class MybatisDefaultDBFieldHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        if (!ObjectUtil.isNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {
            BaseEntity entity = (BaseEntity) metaObject.getOriginalObject();

            LocalDateTime current = LocalDateTime.now();
            // 创建时间为空，则以当前时间为插入时间
            if (ObjectUtil.isNull(entity.getCreateTime())) {
                entity.setCreateTime(current);
            }
            // 更新时间为空，则以当前时间为更新时间
            if (ObjectUtil.isNull(entity.getUpdateTime())) {
                entity.setUpdateTime(current);
            }

            // 获取登录用户id
            Long userId = ServletUtil.getUserId();
            // 当前用户不为空，创建人为空，则插入创建人
            if (!ObjectUtil.isNull(userId) && ObjectUtil.isNull(entity.getCreateBy())) {
                entity.setCreateBy(userId);
            }
            // 当前用户不为空，最后更新人为空，则插入最后更新人
            if (!ObjectUtil.isNull(userId) && ObjectUtil.isNull(entity.getUpdateBy())) {
                entity.setUpdateBy(userId);
            }
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 变更时间为空，则以当前时间为更新时间
        Object updateTime = getFieldValByName("updateTime", metaObject);
        if (ObjectUtil.isNull(updateTime)) {
            setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
        }

        // 当前登录用户不为空，更新人为空，则插入更新人
        Object updater = getFieldValByName("updater", metaObject);
        Long userId = ServletUtil.getUserId();
        if (!ObjectUtil.isNull(userId) && ObjectUtil.isNull(updater)) {
            setFieldValByName("updateBy", userId, metaObject);
        }
    }
}
